package org.tech4j.common.zip.api;

import org.tech4j.common.spi.SPI;

import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;

/**
 * @program: tech4j-common
 * @description:
 * @author: YuKai Fan
 * @create: 2025/3/3 20:24
 **/
@SPI
public interface ZipExecutor {

    /**
     * 最大压缩长度
     *
     * Lz4压缩：表示最大压缩长度
     *
     * Gzip: 表示压缩缓存区大小
     * @param maxLength
     * @return int
     */
    int maxCompressedLength(int maxLength);

    /**
     * 数据压缩
     * @param data data
     * @return CompressData
     */
    CompressData compress(byte[] data);

    /**
     * 数据解压
     * @param data CompressData
     * @return byte
     */
    byte[] decompress(CompressData data);

    /**
     * byte缓冲压缩
     * @param input input
     * @param output output
     */
    default void compress(ByteBuffer input, ByteBuffer output) {};


    /**
     * byte缓冲解压
     * @param input input
     * @param output output
     */
    default void decompress(ByteBuffer input, ByteBuffer output) {};

    /**
     * 数据压缩
     * @param input input
     * @param output output
     */
    default void compress(InputStream input, OutputStream output) {}

    /**
     * 数据解压
     * @param input input
     * @param output output
     * @return CompressData
     */
    default void decompress(InputStream input, OutputStream output) {}
}
